上节我们实现了完整的编译流程,支持了插件,可以通过引入模块的方式使用,这一节我们实现下命令行的方式。
我们会实现以下功能:
- 支持命令行指定参数,指定要编译的文件、输出目录、是否 watch 等
- 支持配置文件
- 编译文件的路径支持 glob,可以模糊匹配
- 生成 sourcemap,自动添加 sourceMapUrl 到文件内容中
- 支持 watch,文件变动立即重新编译
# 思路分析
命令行工具就是通过命令行启动的,要支持命令行启动需要在 js 文件开头加上
#!/usr/bin/env node
@前端进阶之旅: 代码已经复制到剪贴板
命令行参数的解析可以使用 commander,它可以解析命令行参数,然后可以直接拿到 parse 之后的结果。
配置文件的指定可以使用 cosmiconfig,它支持如下的查找方式:
package.json的属性- 扩展名为 rc 的 JSON 或者 YAML
- 扩展名为
.json、.yaml、.yml、.js、.cjs、.config.js、.config.cjs的 rc 文件 .config.js或者.config.cjs的 commonjs 模块
这种配置文件查找机制在 eslint、babel 等很多工具中都有应用,我们也采用这种方式。
文件模糊匹配使用 glob 来匹配,它会返回匹配后的文件路径。
glob("**/*.js", options, function (er, files) {})
@前端进阶之旅: 代码已经复制到剪贴板
watch 的实现使用 chokidar,它会监听文件的变动,包括文件增加、删除、修改、重命名,目录增加、删除等,然后把变动的文件路径传入回调函数。监听的文件也支持通过 glob 字符串来指定。
知道了 watch、命令行参数解析、配置文件查找、文件模糊匹配都怎么做之后,我们来串联下整体流程:
- 通过 commander 解析命令行参数,拿到 outDir(输出目录)、watch(是否监听)以及 glob 字符串
- 解析 glob 字符串,拿到要编译的文件路径
- 查找配置文件,拿到配置
